<?php

/**
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements. See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License. You may obtain a copy of the License at
 *
 *	   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 * @package log4php
 */

/**
 * LoggerPatternConverter is an abstract class that provides the formatting
 * functionality that derived classes need.
 *
 * <p>Conversion specifiers in a conversion patterns are parsed to
 * individual PatternConverters. Each of which is responsible for
 * converting a logging event in a converter specific manner.</p>
 *
 * @version $Revision: 1326626 $
 * @package log4php
 * @subpackage helpers
 * @since 0.3
 */
abstract class LoggerPatternConverter
{

    /**
     * Next converter in the converter chain.
     *
     * @var LoggerPatternConverter
     */
    public $next = null;

    /**
     * Formatting information, parsed from pattern modifiers.
     *
     * @var LoggerFormattingInfo
     */
    protected $formattingInfo;

    /**
     * Converter-specific formatting options.
     *
     * @var array
     */
    protected $option;

    /**
     * Constructor
     *
     * @param LoggerFormattingInfo $formattingInfo            
     * @param array $option            
     */
    public function __construct(LoggerFormattingInfo $formattingInfo = null, $option = null)
    {
        $this->formattingInfo = $formattingInfo;
        $this->option = $option;
        $this->activateOptions();
    }

    /**
     * Called in constructor.
     * Converters which need to process the options
     * can override this method.
     */
    public function activateOptions()
    {}

    /**
     * Converts the logging event to the desired format.
     * Derived pattern
     * converters must implement this method.
     *
     * @param LoggerLoggingEvent $event            
     */
    abstract public function convert(LoggerLoggingEvent $event);

    /**
     * Converts the event and formats it according to setting in the
     * Formatting information object.
     *
     * @param
     *            string &$sbuf string buffer to write to
     * @param LoggerLoggingEvent $event
     *            Event to be formatted.
     */
    public function format(&$sbuf, $event)
    {
        $string = $this->convert($event);
        
        if (! isset($this->formattingInfo)) {
            $sbuf .= $string;
            return;
        }
        
        $fi = $this->formattingInfo;
        
        // Empty string
        if ($string === '' || is_null($string)) {
            if ($fi->min > 0) {
                $sbuf .= str_repeat(' ', $fi->min);
            }
            return;
        }
        
        $len = strlen($string);
        
        // Trim the string if needed
        if ($len > $fi->max) {
            if ($fi->trimLeft) {
                $sbuf .= substr($string, $len - $fi->max, $fi->max);
            } else {
                $sbuf .= substr($string, 0, $fi->max);
            }
        }         

        // Add padding if needed
        else 
            if ($len < $fi->min) {
                if ($fi->padLeft) {
                    $sbuf .= str_repeat(' ', $fi->min - $len);
                    $sbuf .= $string;
                } else {
                    $sbuf .= $string;
                    $sbuf .= str_repeat(' ', $fi->min - $len);
                }
            }             

            // No action needed
            else {
                $sbuf .= $string;
            }
    }
}
